8037db74: 27 bd ff c8  ADDIU sp, sp, 0xffffffc8 (-56)
8037db78: af bf 00 1c  SW ra, sp, 0x1c (28)

8037db7c: 3c 0e 80 39  LUI t6, 0x8039 (32825)
8037db80: 8d ce bd 80  LW t6, t6, 0xffffbd80 (-17024)
8037db84: 91 cf 00 01  LBU t7, t6, 0x1 (1)
8037db88: af af 00 28  SW t7, sp, 0x28 (40)             [sp + 0x28] = layout_wp->off0x01

8037db8c: 3c 18 80 39  LUI t8, 0x8039 (32825)
8037db90: 8f 18 bd 80  LW t8, t8, 0xffffbd80 (-17024)
8037db94: 8f 19 00 08  LW t9, t8, 0x8 (8)
8037db98: af b9 00 24  SW t9, sp, 0x24 (36)             [sp + 0x24] = layout_wp->off0x08

8037db9c: 3c 08 80 39  LUI t0, 0x8039 (32825)
8037dba0: 8d 08 bd 80  LW t0, t0, 0xffffbd80 (-17024)
8037dba4: af a8 00 20  SW t0, sp, 0x20 (32)             [sp + 0x20] = layout_wp

8037dba8: 8f a5 00 20  LW a1, sp, 0x20 (32)
8037dbac: 27 a4 00 2c  ADDIU a0, sp, 0x2c (44)
8037dbb0: 0c 0d f2 f0  JAL 0x8037cbc0 (-2143827008)     0x8037cbc0(&[sp + 0x2c], [sp + 0x20] + 2)
8037dbb4: 24 a5 00 02  ADDIU a1, a1, 0x2 (2)

8037dbb8: 3c 04 80 39  LUI a0, 0x8039 (32825)
8037dbbc: 27 a9 00 2c  ADDIU t1, sp, 0x2c (44)
8037dbc0: af a9 00 10  SW t1, sp, 0x10 (16)                 [sp + 0x10] = &[sp + 0x2c]
8037dbc4: 8c 84 bc a0  LW a0, a0, 0xffffbca0 (-17248)       a0 = *(0x8038bca0)
8037dbc8: 00 00 28 25  OR a1, r0, r0                        a1 = 0
8037dbcc: 8f a6 00 28  LW a2, sp, 0x28 (40)                 a2 = [sp + 0x28]
8037dbd0: 0c 0d ee d2  JAL 0x8037bb48 (-2143831224)    [sp + 0x34] = 0x8037bb48(*(0x8038bca0), 0, [sp + 0x28], [sp + 0x24] /? , &[sp + 0x2c] ?/)
8037dbd4: 8f a7 00 24  LW a3, sp, 0x24 (36)
8037dbd8: af a2 00 34  SW v0, sp, 0x34 (52)

8037dbdc: 0c 0d f3 1d  JAL 0x8037cc74 (-2143826828)    0x8037cc74([sp + 0x34])
8037dbe0: 8f a4 00 34  LW a0, sp, 0x34 (52)

8037dbe4: 3c 0a 80 39  LUI t2, 0x8039 (32825)          /* adv wp */
8037dbe8: 8d 4a bd 80  LW t2, t2, 0xffffbd80 (-17024)
8037dbec: 3c 01 80 39  LUI at, 0x8039 (32825)
8037dbf0: 25 4b 00 0c  ADDIU t3, t2, 0xc (12)
8037dbf4: ac 2b bd 80  SW t3, at, 0xffffbd80 (-17024)

8037dbf8: 10 00 00 01  BEQ r0, r0, 0x8037dc00 (pc + 0x4)
8037dbfc: 00 00 00 00  NOP

8037dc00: 8f bf 00 1c  LW ra, sp, 0x1c (28)
8037dc04: 27 bd 00 38  ADDIU sp, sp, 0x38 (56)
8037dc08: 03 e0 00 08  JR ra
8037dc0c: 00 00 00 00  NOP



extern void *layout_wp;          /* 0x8038bd80 */
extern short layout_call_si;     /* 0x8038bd7a */
extern void layout_call_stack[]; /* 0x8038bcb8 */


{
    [sp + 0x28] = layout_wp->off0x01
    [sp + 0x24] = layout_wp->off0x08
    [sp + 0x20] = layout_wp
    0x8037cbc0(&[sp + 0x2c], [sp + 0x20] + 2)
    [sp + 0x34] = 0x8037bb48(*(0x8038bca0), 0, [sp + 0x28], [sp + 0x24] /? , &[sp + 0x2c] ?/)
    0x8037cc74([sp + 0x34])
    /* adv wp */
}

typedef struct tagTHREESIXTEENTARGET {
    short a;                           /* 2 @ 0x00 init to 0x19 */
    short b;                           /* 2 @ 0x02 init to first param in high half and 1 in low half */
    struct tagTHREESIXTEENTARGET *c;   /* 4 @ 0x04 init to a self pointer */
    struct tagTHREESIXTEENTARGET *d;   /* 4 @ 0x08 init to a self pointer */
    long e;                            /* 4 @ 0x0c */
    long f;                            /* 4 @ 0x10 */
    uint32_t segptr;                   /* 4 @ 0x14 segmented pointer to GBI commands */
    short arr[3]                       /* 6 @ 0x18 copied from command */
                                         /* @ 0x1e end? */
} THREESIXTEENTARGET;


{
    uint32_t segptr;
    void *local_layout_wp;
    short arr[3];

    [sp + 0x28] = layout_wp->off0x01
    segptr = layout_wp->off0x08
    local_layout_wp = layout_wp
    0x8037cbc0(arr, local_layout_wp + 2)
    [sp + 0x34] = 0x8037bb48(*(0x8038bca0), 0, [sp + 0x28], segptr , arr)
    0x8037cc74([sp + 0x34])
    /* adv wp */
}

/***********************************************/


8037cbc0: 84 ae 00 00  LH t6, a1, 0x0 (0)
8037cbc4: 24 a5 00 02  ADDIU a1, a1, 0x2 (2)
8037cbc8: a4 8e 00 00  SH t6, a0, 0x0 (0)       arg1[0] = *(arg2++)

8037cbcc: 84 af 00 00  LH t7, a1, 0x0 (0)
8037cbd0: 24 a5 00 02  ADDIU a1, a1, 0x2 (2)
8037cbd4: a4 8f 00 02  SH t7, a0, 0x2 (2)       arg1[1] = *(arg2++)

8037cbd8: 84 b8 00 00  LH t8, a1, 0x0 (0)
8037cbdc: 24 a5 00 02  ADDIU a1, a1, 0x2 (2)
8037cbe0: a4 98 00 04  SH t8, a0, 0x4 (4)       arg1[2] = *(arg2++)

8037cbe4: 03 e0 00 08  JR ra                    return arg2
8037cbe8: 00 a0 10 25  OR v0, a1, r0



/************************************************/

8037bb48: 27 bd ff e8  ADDIU sp, sp, 0xffffffe8 (-24)
8037bb4c: af bf 00 14  SW ra, sp, 0x14 (20)
8037bb50: af a4 00 18  SW a0, sp, 0x18 (24)                     [sp + 0x18] === arg1
8037bb54: af a5 00 1c  SW a1, sp, 0x1c (28)                     [sp + 0x1c] === arg2
8037bb58: af a6 00 20  SW a2, sp, 0x20 (32)                     [sp + 0x20] === arg3
8037bb5c: af a7 00 24  SW a3, sp, 0x24 (36)                     [sp + 0x24] === arg4
                                                                [sp + 0x28] === arg5

8037bb60: 8f ae 00 18  LW t6, sp, 0x18 (24)
8037bb64: 11 c0 00 05  BEQ r0, t6, 0x8037bb7c (pc + 0x14)   if (!arg1) goto 0x8037bb7c
8037bb68: 00 00 00 00  NOP

8037bb6c: 8f a4 00 18  LW a0, sp, 0x18 (24)
8037bb70: 0c 09 e2 ae  JAL 0x80278ab8 (-2144892232)         arg2 = 0x80278ab8(arg1, 0x20)
8037bb74: 24 05 00 20  ADDIU a1, r0, 0x20 (32)
8037bb78: af a2 00 1c  SW v0, sp, 0x1c (28)

8037bb7c: 8f af 00 1c  LW t7, sp, 0x1c (28)
8037bb80: 11 e0 00 12  BEQ r0, t7, 0x8037bbcc (pc + 0x48)   if (!arg2) goto 0x8037bbcc
8037bb84: 00 00 00 00  NOP

8037bb88: 8f a4 00 1c  LW a0, sp, 0x1c (28)
8037bb8c: 0c 0d ec 88  JAL 0x8037b220 (-2143833568)         0x8037b220(arg2, 0x19)
8037bb90: 24 05 00 19  ADDIU a1, r0, 0x19 (25)

8037bb94: 8f a4 00 1c  LW a0, sp, 0x1c (28)
8037bb98: 8f a5 00 28  LW a1, sp, 0x28 (40)
8037bb9c: 0c 0d e2 4f  JAL 0x8037893c (-2143844036)         0x8037893c(arg2+0x18, arg5)
8037bba0: 24 84 00 18  ADDIU a0, a0, 0x18 (24)

8037bba4: 8f a8 00 1c  LW t0, sp, 0x1c (28)
8037bba8: 8f b8 00 20  LW t8, sp, 0x20 (32)
8037bbac: 85 09 00 02  LH t1, t0, 0x2 (2)                       t1 = arg2->off0x02
8037bbb0: 00 18 ca 00  SLL t9, t8, 0x8 (8)                      t9 = arg3 << 8
8037bbb4: 31 2a 00 ff  ANDI t2, t1, 0xff (255)                  t2 = t1 & 0xff === arg2->off0x02 & 0xff
8037bbb8: 03 2a 58 25  OR t3, t9, t2                            t3 = t9 | t2 === (arg3 << 8) | (arg2->off0x02 & 0xff)
8037bbbc: a5 0b 00 02  SH t3, t0, 0x2 (2)                   arg2->off0x02 = (arg3 << 8) | (arg2->off0x02 & 0xff)

8037bbc0: 8f ac 00 24  LW t4, sp, 0x24 (36)
8037bbc4: 8f ad 00 1c  LW t5, sp, 0x1c (28)
8037bbc8: ad ac 00 14  SW t4, t5, 0x14 (20)                 arg2->off0x14 = arg4

8037bbcc: 10 00 00 03  BEQ r0, r0, 0x8037bbdc (pc + 0xc)
8037bbd0: 8f a2 00 1c  LW v0, sp, 0x1c (28)
8037bbd4: 10 00 00 01  BEQ r0, r0, 0x8037bbdc (pc + 0x4)
8037bbd8: 00 00 00 00  NOP
8037bbdc: 8f bf 00 14  LW ra, sp, 0x14 (20)
8037bbe0: 27 bd 00 18  ADDIU sp, sp, 0x18 (24)
8037bbe4: 03 e0 00 08  JR ra                                return arg2
8037bbe8: 00 00 00 00  NOP

{
    if (arg1) {
        arg2 = 0x80278ab8(arg1, 0x20);
    }
    if (arg2) {
        0x8037b220(arg2, 0x19);
        0x8037893c(&(arg2->off0x18), arg5);   /* seems to just copy */
        arg2->off0x02 = (arg3 << 8) | (arg2->off0x02 & 0xff);
        arg2->off0x14 = arg4;
    }
    return arg2;
}
/*******************************************************/
8037b220: a4 85 00 00  SH a1, a0, 0x0 (0)

8037b224: 24 0e 00 01  ADDIU t6, r0, 0x1 (1)
8037b228: a4 8e 00 02  SH t6, a0, 0x2 (2)

8037b22c: ac 84 00 04  SW a0, a0, 0x4 (4)

8037b230: ac 84 00 08  SW a0, a0, 0x8 (8)

8037b234: ac 80 00 0c  SW r0, a0, 0xc (12)

8037b238: ac 80 00 10  SW r0, a0, 0x10 (16)

8037b23c: 03 e0 00 08  JR ra
8037b240: 00 00 00 00  NOP

0x8037b220(struct ??? *arg1, short arg2)
{
    arg1->off0x00 = arg2;
    arg1->off0x02 = 1;
    arg1->off0x04 = arg1;
    arg1->off0x08 = arg1;
    arg1->off0x0c = 0;
    arg1->off0x10 = 0;
}

/*******************************************************/

8037cc74: 27 bd ff e8  ADDIU sp, sp, 0xffffffe8 (-24)
8037cc78: af bf 00 14  SW ra, sp, 0x14 (20)
8037cc7c: af a4 00 18  SW a0, sp, 0x18 (24)                       [sp + 0x18] === arg1

8037cc80: 8f ae 00 18  LW t6, sp, 0x18 (24)
8037cc84: 11 c0 00 30  BEQ r0, t6, 0x8037cd48 (pc + 0xc0)     if (!arg1) goto 0x8037cd48;
8037cc88: 00 00 00 00  NOP

8037cc8c: 3c 18 80 39  LUI t8, 0x8039 (32825)
8037cc90: 87 18 bd 78  LH t8, t8, 0xffffbd78 (-17032)
8037cc94: 8f af 00 18  LW t7, sp, 0x18 (24)
8037cc98: 3c 01 80 39  LUI at, 0x8039 (32825)
8037cc9c: 00 18 c8 80  SLL t9, t8, 0x2 (2)
8037cca0: 00 39 08 21  ADDU at, at, t9
8037cca4: ac 2f bc f8  SW t7, at, 0xffffbcf8 (-17160)         0x8038bcf8[*(0x8038bd78)] = arg1;

8037cca8: 3c 08 80 39  LUI t0, 0x8039 (32825)
8037ccac: 85 08 bd 78  LH t0, t0, 0xffffbd78 (-17032)
8037ccb0: 15 00 00 0a  BNE t0, r0, 0x8037ccdc (pc + 0x28)     if (*(0x8038bd78)) goto 0x8037ccdc;
8037ccb4: 00 00 00 00  NOP

8037ccb8: 3c 09 80 39  LUI t1, 0x8039 (32825)
8037ccbc: 8d 29 bc a4  LW t1, t1, 0xffffbca4 (-17244)
8037ccc0: 15 20 00 04  BNE t1, r0, 0x8037ccd4 (pc + 0x10)     if ((*(0x8038bca4))) goto 0x8037ccd4;
8037ccc4: 00 00 00 00  NOP

8037ccc8: 8f aa 00 18  LW t2, sp, 0x18 (24)
8037cccc: 3c 01 80 39  LUI at, 0x8039 (32825)
8037ccd0: ac 2a bc a4  SW t2, at, 0xffffbca4 (-17244)         *(0x8038bca4) = arg1;
                                                            0x8037ccd4:
8037ccd4: 10 00 00 1c  BEQ r0, r0, 0x8037cd48 (pc + 0x70)     goto 0x8037cd48
8037ccd8: 00 00 00 00  NOP
                                                            0x8037ccdc:
8037ccdc: 3c 0b 80 39  LUI t3, 0x8039 (32825)
8037cce0: 85 6b bd 78  LH t3, t3, 0xffffbd78 (-17032)             t3 = *(0x8038bd78)
8037cce4: 3c 0d 80 39  LUI t5, 0x8039 (32825)                     t5 = 0x80390000
8037cce8: 24 01 00 29  ADDIU at, r0, 0x29 (41)
8037ccec: 00 0b 60 80  SLL t4, t3, 0x2 (2)                        t4 = t3 * 4 === *(0x8038bd78) * 4
8037ccf0: 01 ac 68 21  ADDU t5, t5, t4                            t5 = t5 + t4 === 0x80390000 + *(0x8038bd78)*4
8037ccf4: 8d ad bc f4  LW t5, t5, 0xffffbcf4 (-17164)             t5 = *(t5 + 0xffffbcf4) === 0x8038bcf4[*(0x8038bd78)]
8037ccf8: 85 ae 00 00  LH t6, t5, 0x0 (0)                         t6 = *t5 === *(0x8038bcf4[*(0x8038bd78)])
8037ccfc: 15 c1 00 0a  BNE t6, at, 0x8037cd28 (pc + 0x28)     if (*(0x8038bcf4[*(0x8038bd78)]) != 0x29) goto 0x8037cd28;
8037cd00: 00 00 00 00  NOP

8037cd04: 3c 0f 80 39  LUI t7, 0x8039 (32825)
8037cd08: 85 ef bd 78  LH t7, t7, 0xffffbd78 (-17032)
8037cd0c: 3c 08 80 39  LUI t0, 0x8039 (32825)
8037cd10: 8f b8 00 18  LW t8, sp, 0x18 (24)
8037cd14: 00 0f c8 80  SLL t9, t7, 0x2 (2)                    
8037cd18: 01 19 40 21  ADDU t0, t0, t9
8037cd1c: 8d 08 bc f4  LW t0, t0, 0xffffbcf4 (-17164)
8037cd20: 10 00 00 09  BEQ r0, r0, 0x8037cd48 (pc + 0x24)     (0x8038bcf4[*(0x8038bd78)])->off0x14 = arg1;
8037cd24: ad 18 00 14  SW t8, t0, 0x14 (20)                   goto 0x8037cd48;
                                                            0x8037cd28:
8037cd28: 3c 09 80 39  LUI t1, 0x8039 (32825)
8037cd2c: 85 29 bd 78  LH t1, t1, 0xffffbd78 (-17032)
8037cd30: 3c 04 80 39  LUI a0, 0x8039 (32825)
8037cd34: 8f a5 00 18  LW a1, sp, 0x18 (24)
8037cd38: 00 09 50 80  SLL t2, t1, 0x2 (2)
8037cd3c: 00 8a 20 21  ADDU a0, a0, t2
8037cd40: 0c 0d f0 11  JAL 0x8037c044 (-2143829948)           0x8037c044(0x8038bcf4[*(0x8038bd78)], arg1);
8037cd44: 8c 84 bc f4  LW a0, a0, 0xffffbcf4 (-17164)
                                                            0x8037cd48:
8037cd48: 10 00 00 01  BEQ r0, r0, 0x8037cd50 (pc + 0x4)
8037cd4c: 00 00 00 00  NOP

8037cd50: 8f bf 00 14  LW ra, sp, 0x14 (20)
8037cd54: 27 bd 00 18  ADDIU sp, sp, 0x18 (24)
8037cd58: 03 e0 00 08  JR ra
8037cd5c: 00 00 00 00  NOP

{
if (!arg1) goto 0x8037cd48;
0x8038bcf8[*(0x8038bd78)] = arg1;
if (*(0x8038bd78)) goto 0x8037ccdc;
if ((*(0x8038bca4))) goto 0x8037ccd4;
*(0x8038bca4) = arg1;
0x8037ccd4:
goto 0x8037cd48
0x8037ccdc:
if (*(0x8038bcf4[*(0x8038bd78)]) != 0x29) goto 0x8037cd28;
(0x8038bcf4[*(0x8038bd78)])->off0x14 = arg1;
goto 0x8037cd48;
0x8037cd28:
0x8037c044(0x8038bcf4[*(0x8038bd78)], arg1);
0x8037cd48:
}


{
    if (arg1) {
        0x8038bcf8[*(0x8038bd78)] = arg1;
        if (!*(0x8038bd78)) {
            if (!(*(0x8038bca4))) {
                *(0x8038bca4) = arg1;
            }
        } else if ((0x8038bcf4[*(0x8038bd78)])->off0x0) == 0x29) {
            (0x8038bcf4[*(0x8038bd78)])->off0x14 = arg1;
        } else {
            0x8037c044(0x8038bcf4[*(0x8038bd78)], arg1);
        }
        
    }
}

/***************************************************/

8037c044: 27 bd ff f8  ADDIU sp, sp, 0xfffffff8 (-8)
8037c048: 10 a0 00 16  BEQ r0, a1, 0x8037c0a4 (pc + 0x58)
8037c04c: 00 00 00 00  NOP

8037c050: ac a4 00 0c  SW a0, a1, 0xc (12)                    arg2->off0x0c = arg1;

8037c054: 8c 8e 00 10  LW t6, a0, 0x10 (16)
8037c058: af ae 00 04  SW t6, sp, 0x4 (4)                     [sp + 0x04] = arg1->off0x10;

8037c05c: 8f af 00 04  LW t7, sp, 0x4 (4)
8037c060: 15 e0 00 05  BNE t7, r0, 0x8037c078 (pc + 0x14)     if ([sp + 0x04]) goto 0x8037c078;
8037c064: 00 00 00 00  NOP

8037c068: ac 85 00 10  SW a1, a0, 0x10 (16)                   arg1->off0x10 = arg2;

8037c06c: ac a5 00 04  SW a1, a1, 0x4 (4)                     arg2->off0x04 = arg2;

8037c070: 10 00 00 0c  BEQ r0, r0, 0x8037c0a4 (pc + 0x30)     arg2->off0x08 = arg2;
8037c074: ac a5 00 08  SW a1, a1, 0x8 (8)                     goto 0x8037c0a4;

8037c078: 8f b8 00 04  LW t8, sp, 0x4 (4)
8037c07c: 8f 19 00 04  LW t9, t8, 0x4 (4)
8037c080: af b9 00 00  SW t9, sp, 0x0 (0)                     [sp + 0x00] = [sp + 0x04]->off0x04;

8037c084: 8f a8 00 00  LW t0, sp, 0x0 (0)
8037c088: ac a8 00 04  SW t0, a1, 0x4 (4)                     arg2->off0x04 = [sp + 0x00];

8037c08c: 8f a9 00 04  LW t1, sp, 0x4 (4)
8037c090: ac a9 00 08  SW t1, a1, 0x8 (8)                     arg2->off0x08 = [sp + 0x04];

8037c094: 8f aa 00 04  LW t2, sp, 0x4 (4)
8037c098: ad 45 00 04  SW a1, t2, 0x4 (4)                     [sp + 0x04]->0x04 = arg2;

8037c09c: 8f ab 00 00  LW t3, sp, 0x0 (0)
8037c0a0: ad 65 00 08  SW a1, t3, 0x8 (8)                     [sp + 0x00]->0x08 = arg2;

8037c0a4: 10 00 00 03  BEQ r0, r0, 0x8037c0b4 (pc + 0xc)
8037c0a8: 00 a0 10 25  OR v0, a1, r0                          return arg2;
8037c0ac: 10 00 00 01  BEQ r0, r0, 0x8037c0b4 (pc + 0x4)
8037c0b0: 00 00 00 00  NOP
8037c0b4: 03 e0 00 08  JR ra
8037c0b8: 27 bd 00 08  ADDIU sp, sp, 0x8 (8)

{
    arg2->off0x0c = arg1;
    [sp + 0x04] = arg1->off0x10;
    if (![sp + 0x04]) {
        arg1->off0x10 = arg2;
        arg2->off0x04 = arg2;
        arg2->off0x08 = arg2;
    } else {
        [sp + 0x00] = [sp + 0x04]->off0x04;
        arg2->off0x04 = [sp + 0x00];
        arg2->off0x08 = [sp + 0x04];
        [sp + 0x04]->0x04 = arg2;
        [sp + 0x00]->0x08 = arg2;
    }
    return arg2;
}

typedef struct tagTHREESIXTEENTARGET {
    short a;                              /* 2 @ 0x00 init to 0x19 */
    short b;                              /* 2 @ 0x02 init to first param in high half and 1 in low half */
    struct tagTHREESIXTEENTARGET *next;   /* 4 @ 0x04 init to a self pointer */
    struct tagTHREESIXTEENTARGET *prev;   /* 4 @ 0x08 init to a self pointer */ /* NOTE!!! next and prev are BACKWARDS here! Corrected in struct_layout_node.txt */
    struct tagTHREESIXTEENTARGET *parent; /* 4 @ 0x0c parent? */
    struct tagTHREESIXTEENTARGET *child;  /* 4 @ 0x10 child? */
    uint32_t segptr;                      /* 4 @ 0x14 segmented pointer to GBI commands */
    short arr[3]                          /* 6 @ 0x18 copied from command */
                                          /* @ 0x1e end? */
} THREESIXTEENTARGET;

THREESIXTEENTARGET * 0x8037c044(THREESIXTEENTARGET *nft, THREESIXTEENTARGET *newnode)
{
    newnode->parent = nft;
    current_child = nft->child;
    if (!current_child) {        /* firstborn */ 
        nft->child = newnode;
        newnode->next = newnode;
        newnode->prev = newnode;
    } else {                     /* or not */
        new_next = current_child->next;
        newnode->next       = new_next;
        newnode->prev       = current_child;
        current_child->next = newnode;
        new_next->prev      = newnode;
    }
    return newnode;
}
